

#include <iostream>
// 单例模式——一个类只能创建一个对象
// 该类只能实力化一个对象，并提供一个全局访问点

//饿汉模式
//程序启动立即初始化，以空间换时间
//单例对象已确定，多线程获取单例对象不需要加锁
// class Singleto
// {
// private:
//     Singleto():_data(99){
//         std::cout<<"构造单例对象"<<std::endl;
//     }
//     Singleto(const Singleto &) = delete;
//     Singleto &operator=(const Singleto &) = delete;
// private:
//     static Singleto _eto;
//     int _data;
// public:
//     static Singleto& GetInstance()
//     {
//         return _eto;
//     }
//         int getData()
//     {
//         return _data;
//     }
// };

// Singleto Singleto::_eto;
// int main()
// {
//     std::cout<<Singleto::GetInstance().getData()<<std::endl;;
//     return 0;
// }

// 懒汉模式
// 第一次使用时才开始实例化单例对象
class Singleto
{
    private:
    int _data;
    Singleto():_data(99){
        std::cout<<"单例构造对象"<<std::endl;
    }
    Singleto(const Singleto&)=delete;
    Singleto& operator=(const Singleto&)=delete;
    public:
    static Singleto& GetInstance()
    {
        //自C++11起，静态变量可以在线程安全的情况下被构造和析构
        //所以这里不需要加锁
        static Singleto _eto;
        return _eto;
    }
    int getData()
    {
        return _data;
    }
};

int main()
{
    std::cout<<Singleto::GetInstance().getData()<<std::endl;
    return 0;
}
